package com.shujia.mr.clazzSort2;


import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


public class ClazzSortReducer extends Reducer<Text,StudentMap, Text, Text> {

    /*
        1. 接受Map端发送过来的数据
        2. 对相同班级中的Values数据进行遍历
        3. 将学生数据报装成一个学生对象
        4. 将学生对象添加到List中
        5. 对List进行排序
        6. 取出前3名 写出
     */


    /**
     *
     * @param key 班级
     * @param values 相同班级的学生数据
     * @param context 上下文对象，链接Map及Reduce
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<StudentMap> values, Reducer<Text, StudentMap, Text, Text>.Context context) throws IOException, InterruptedException {


        /**
         *  分析问题的过程：
         *      1.看结果是否正确
         *          1.1 如果结果没有，那么说明执行过程可能有错误
         *          1.2 看日志信息
         *                  1.异常名称
         *                  2.提示 错误原因
         *                  3.问题发生的位置 at ... 自己错误代码位置 、第三方Jar包中的错误位置
         *                  4.找到自己错误代码位置
         *                  5.在错误代码位置上方，debug
         *                       看对应变量内容是否符合设想
         *                  6.看问题变量是如何赋值 如何生成的
         *         1.3 找关系
         *             发送问题：
         *                 1.找出错误的提示信息，尽可能多的提供信息
         *                 2.发送错误的代码
         *                 3.执行逻辑和背景
         *
         *    2.如果结果又问题，执行过程没提示执行错误，那么就是逻辑错误
         *          1.从结果出发，看差距
         *          2.从结果出发，逆序排错（从程序执行顺序出发）
         *          3.找到和设想一样的边界 （错误发生的位置）
         *          4.编写代码查看或修改逻辑
         *
         */


        /**
         *  集合中存储的是数据的引用，数据一样，表示存储的引用都是同一个
         *      如何解决？
         *          将引用变成多个 ->  new StudentMap 并填充数据到新的引用中，再添加到集合中
         *
         *
         */
        // 创建一个集合 给集合添加学生数据
        ArrayList<StudentMap> studentMaps = new ArrayList<>();
//        StudentMap studentMap = new StudentMap(); //
        for (StudentMap value : values) {
//            studentMaps.add(value);
            // public StudentMap(String id, String name, int age, String gender, String clazz, int score) {

            studentMaps.add(new StudentMap(value.id,value.name,value.age,value.gender,value.clazz, value.score));
        }

        // 对集合中的数据进行排序

        Collections.sort(studentMaps, new Comparator<StudentMap>() {
            @Override
            public int compare(StudentMap o1, StudentMap o2) {
                int res = o1.score - o2.score;
                return -(res == 0 ? o1.id.compareTo(o2.id) : res);
            }
        });

        // 取出前三数据
        for (int i = 0; i < 3; i++) {
            StudentMap student = studentMaps.get(i);
            context.write(new Text(student.id), new Text(student.toString()));
        }

    }
}





